//
// Created by huangjunhao on 2022/10/11.
//
#include "ListStack.h"


// 封装创建节点方法
struct StackNode *createNode(ElemType data){
    StackNode *newNode = (struct StackNode *)malloc(sizeof(struct StackNode));
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

void insertNodeByHead(StackNode *headNode, ElemType data)  //表头法插入
{
    StackNode* newNode = createNode(data);
    //插在头结点之后
    newNode->next = headNode->next;
    headNode->next = newNode;
}
void printList(struct StackNode *headNode)  //打印，浏览信息
{
    //  有表头，要从第二个节点开始打印
    struct StackNode *pMove = headNode->next;
    while (pMove != NULL)
    {
        printf("%d\t", pMove->data);
        pMove = pMove->next;
    }
    printf("\n");
}



//初始化栈
//void InitStack(LinkStack *s){*s = NULL;}
//入栈  头插ByHead
//void Push(LinkStack *s, ElemType x)
//{
//    StackNode * newNode = createNode(x);
//    //插在头结点之后
//    newNode->next = s->
//}
////显示链栈内的所以元素
//void printfStack(LinkStack *s)
//{
//    StackNode * p =  *s;//指向栈顶
//    if(p==NULL) printf("栈为空！\n");
//    else{
//        while(p != NULL)//向下搜索栈结点，如果找到则将其数据输出
//        {
//            printf("%d\n",p->data);
//            p = p->next;
//        }
//        printf("栈长度：%d\n",Size(s));
//    }
//}
//
////出栈（头删）
//void Pop(LinkStack *s)
//{
//    StackNode *p = *s;
//    //指向新的栈顶
//    *s = p->next;
//    //删除结点
//    free(p);
//    p = NULL;
//}
//
////判断栈是否为空
//bool IsEmpty(LinkStack *s)
//{
//    //如果栈顶top的值等于0，则表示栈为空
//    if(*s==NULL)
//        return true;
//    else
//        return false;
//}
//
////获取栈顶元素
//bool GetTop(LinkStack *s, ElemType *v)
//{
//    //如果栈为空，则获取不了栈顶元素
//    if(IsEmpty(s))
//    {
//        printf("栈空间已空,不能取栈顶元素.\n");
//        return false;
//    }
//    //获取栈顶元素
//    *v = (*s)->data;
//    return true;
//}
//
////获取栈内元素的个数
//int Size(LinkStack *s)
//{
//    int len=0;
//    StackNode *p = *s;
//    while(p!=NULL)
//    {//不断下移查找元素个数
//        p=p->next;
//        len++;
//    }
//    return len;
//}
//
//
////清空栈
//void Clear(LinkStack *s)
//{
//    while(*s!=NULL)
//    {//只要栈内还有元素就出栈
//        Pop(s);
//    }
//}












//指针变量  动态内存申请
LinkStack *createStack(){
    //1、指针----->指针变量
    LinkStack *stack = (LinkStack *) malloc(sizeof(LinkStack));
    //2、初始化变量
    stack->size = 0;
    stack->stackTop = NULL;
    //3、返回变量
    return stack;
}

/*  将指定的数据压入栈 */
void push(LinkStack *stack, ElemType data)
{
    //入栈操作----->链表的表头插入
    StackNode *newNode = createNode(data);
    newNode->next = stack->stackTop;  //新来元素的下一个next指向栈顶指针，连续存储
    stack->stackTop = newNode;   //用栈顶指针  永远指向新来的元素
    stack->size++;
}

ElemType getTop(LinkStack *stack)  //获取栈顶元素
{
    if (stack->size == 0)
    {
        printf("栈为空！，无法获取");
        system("pause");
        return stack->size;
    }
    return stack->stackTop->data;
}

void pop(LinkStack *stack){
    if (stack->size == 0)
    {
        printf("栈为空！，无法出栈");
        system("pause");
    }
    else
    {
        //  无表头的链表进行删除
        struct StackNode *nextNode = stack->stackTop->next;  //先保存记录
        free(stack->stackTop);  //将原先节点的占用的内存释放

        stack->stackTop = nextNode;
        stack->size--;
    }
}

//返回1，代表栈不为空
int IsEmpty(LinkStack *s){
    return s->size == 0 ? 0 : 1;
}













